"use strict";

import { app, protocol, BrowserWindow, ipcMain } from "electron";
//import { createProtocol } from "vue-cli-plugin-electron-builder/lib";
const isDevelopment = process.env.NODE_ENV !== "production";
import { autoUpdater } from "electron-updater";
import path from "path";

import { Window } from "./unit/window.js";

let win;

// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
  { scheme: "app", privileges: { secure: true, standard: true } },
]);

async function createWindow() {
  win = new Window();
  win.listen();
  await win.createWindows({ isMainWin: true });
  win.createTray();
}

// Quit when all windows are closed.
app.on("window-all-closed", () => {
  // On macOS it is common for applications and their menu bar
  // to stay active until the user quits explicitly with Cmd + Q
  if (process.platform !== "darwin") {
    app.quit();
  }
});

app.on("activate", () => {
  // On macOS it's common to re-create a window in the app when the
  // dock icon is clicked and there are no other windows open.
  if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on("ready", async () => {
  if (isDevelopment && !process.env.IS_TEST) {
    // Install Vue Devtools
    // try {
    //   await installExtension(VUEJS3_DEVTOOLS);
    // } catch (e) {
    //   console.error("Vue Devtools failed to install:", e.toString());
    // }
  }
  createWindow();
});

// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
  if (process.platform === "win32") {
    process.on("message", (data) => {
      if (data === "graceful-exit") {
        app.quit();
      }
    });
  } else {
    process.on("SIGTERM", () => {
      app.quit();
    });
  }
}

// +++ 以下皆为新增内容
// 主进程监听渲染进程传来的信息
ipcMain.on("update", (e, arg) => {
  console.log(arg);
  checkForUpdates();
});
let checkForUpdates = () => {
  // 在下载之前将autoUpdater的autoDownload属性设置成false，通过渲染进程触发主进程事件来实现这一设置(将自动更新设置成false)
  //autoUpdater.autoDownload = false
  // 配置安装包远端服务器
  //  autoUpdater.setFeedURL('http://localhost/release/');
  //
  // if(isDevelopment){
  //   autoUpdater.updateConfigPath = path.join(__dirname, 'latest.yml')
  // }

  // 下面是自动更新的整个生命周期所发生的事件
  autoUpdater.on("error", function (message) {
    sendUpdateMessage("error", message);
  });
  autoUpdater.on("checking-for-update", function (message) {
    sendUpdateMessage("checking-for-update", message);
  });
  autoUpdater.on("update-available", function (message) {
    sendUpdateMessage("update-available", message);
  });
  autoUpdater.on("update-not-available", function (message) {
    sendUpdateMessage("update-not-available", message);
  });

  // 更新下载进度事件
  autoUpdater.on("download-progress", function (progressObj) {
    sendUpdateMessage("downloadProgress", progressObj);
  });
  // 更新下载完成事件
  autoUpdater.on(
    "update-downloaded",
    function (
      event,
      releaseNotes,
      releaseName,
      releaseDate,
      updateUrl,
      quitAndUpdate
    ) {
      sendUpdateMessage("isUpdateNow");
      ipcMain.on("updateNow", (e, arg) => {
        autoUpdater.quitAndInstall();
      });
    }
  );

  //执行自动更新检查
  //autoUpdater.checkForUpdates();

  // autoUpdater.checkForUpdatesAndNotify().then(result => {
  //   console.log('Autoupdater:', result)
  // });
};

// 主进程主动发送消息给渲染进程函数
function sendUpdateMessage(message, data) {
  win.webContents.send("message", { message, data });
}
